home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1 Issue 2 / PDCD-1 - Issue 02.iso / _utilities / utilities / 004 / gamesuit / !Stasis / Alien / AlSource next >
Text File  |  1994-08-05  |  7KB  |  324 lines

  1. #type &ffa
  2. #name StasisDVox
  3. #base 0
  4. #include ASMLib:Standard
  5. #set Service_PsychoStarting=&80300
  6. #set Service_PsychoDying   =&80301
  7. #set Service_UKStasisFormat=&80310
  8. #set Service_StasisSave    =&80311
  9. #set Service_StasisIdentify=&80312
  10. #set stasis_alien          =1
  11. #set dvox_filetype         =&108
  12.  
  13. struct dvox {
  14.   .type        DCB 0
  15.   .flags    DCB 0
  16.   .pitch    DBB 2
  17.   .dataofs    DCD 0
  18.   .repstart    DCD 0
  19.   .repend    DCD 0
  20.   .id        DCD 0
  21.   .version    DCD 0
  22.   .upcall    DCD 0
  23.   .len        DCD 0
  24.   .sizeof
  25. }
  26.  
  27. .ModuleHeader
  28. .start
  29. DCD 0
  30. DCD init
  31. DCD final
  32. DCD service
  33. DCD title
  34. DCD help
  35. DCD helptable
  36. DCD 0
  37. DCD 0
  38. DCD 0
  39. DCD 0
  40. .title
  41. DCB  "StasisDVox"
  42. DCB 0
  43. ALIGN
  44. .help
  45. DCB  "Stasis Alien",9,"1.00 (24 Jul 1994) - For DataVox format samples"
  46. DCB 0
  47. ALIGN
  48. .helptable
  49. DCB  "StasisDVox"
  50. DCB 0
  51. ALIGN
  52. DCD 0
  53. DCD 0
  54. DCD 0
  55. DCD dvoxhelp
  56. DCD 0;End Marker
  57. .dvoxhelp
  58. DCB "This module allows Stasis to handle DataVox type 3 files.  The samples can be replayed, and saved by the *StasisSave DataVox command.",0
  59. ALIGN
  60. .dvoxid
  61. DCB "DVOX"
  62.  
  63. .service
  64. ;R12 is the only register we may corrupt in a service call
  65. SUBS R12,R1,#&80000
  66. MOVMI PC,R14
  67. SUB R12,R12,#&300
  68. TEQ R12,#Service_UKStasisFormat-&80300
  69. TEQNE R12,#Service_StasisIdentify-&80300
  70. TEQNE R12,#Service_StasisSave-&80300
  71. MOVNE PC,R14
  72. TEQ R12,#Service_StasisIdentify-&80300
  73. BEQ identify
  74. TEQ R12,#Service_StasisSave-&80300
  75. BEQ save
  76. .ukformat
  77. STMFD R13!,{R3-R4,R14}
  78. LDR R3,[R0,#dvox.id]
  79. LDR R4,dvoxid
  80. CMP R3,R4
  81. LDMNEFD R13!,{R3-R4,PC}^
  82. ;identified a DataVox sample.
  83. ;we could also check R2 = &108 (the filetype)
  84.  
  85. ;Not all datavox samples are in logarithmic format.
  86. ;This module must convert it if it isn't.
  87. ;That's what typeconv does.
  88. BL typeconv
  89. ADR R0,alienblock
  90. MOV R1,#0; claim service call
  91. LDMFD R13!,{R3-R4,PC}
  92.  
  93. .typeconv
  94. STMFD R13!,{R0-R5,R14}
  95. LDRB R1,[R0,#dvox.type]; note byte load
  96. MOV R2,#0
  97. CMP R1,#1;datavox linear unsigned type
  98. ADREQ R2,convtab1
  99. CMP R1,#2;datavox linear signed type
  100. ADREQ R2,convtab2
  101. CMP R1,#3;datavox Ulaw type
  102. ADREQ R2,convtab3
  103. CMP R2,#0
  104. LDMEQFD R13!,{R0-R5,PC}
  105. LDR R3,[R0,#dvox.dataofs]
  106. ADD R3,R3,R0
  107. LDR R4,[R0,#dvox.len]
  108. ADD R4,R4,R0
  109. .loop
  110. LDRB R5,[R3]     ;get data from dvox sample
  111. LDRB R5,[R2,R5]  ;look it up in the table
  112. STRB R5,[R3],#1  ;store it back, add 1 to R3
  113. CMP R3,R4
  114. BLT loop
  115. LDMFD R13!,{R0-R5,PC}
  116.  
  117. .convtab1
  118. INCBIN Alien:convtab1
  119. .convtab2
  120. INCBIN Alien:convtab2
  121. .convtab3
  122. INCBIN Alien:convtab3
  123. ALIGN
  124.  
  125.  
  126. .alienblock
  127. DCB "StAl"; ID Word - required - used to check if the block is valid.
  128. DCD getinfo-alienblock;get info routine
  129. DCD putinfo-alienblock;put info routine
  130. DCD 0     ;release routine (we don't have one)
  131. DCD 0     ;must be zero
  132. DCD 0     ;for future use
  133. DCD 0     ;for future use
  134. DCD name1-alienblock
  135. DCD formatname-alienblock
  136. DCD dvox_filetype
  137. DCD title-alienblock
  138. DCD 0
  139. ALIGN
  140.  
  141. ;The info routine is entered with
  142. ;R0 points to the stasis slot decription block
  143. ;R1 points to your sample
  144.  
  145. ;The file length as loaded may be accessed by LDR R0,[R10,#4]
  146.  
  147. ;The info entry should return:
  148.  
  149. ;R1=name *
  150. ;R2=length
  151. ;R3=finetune * &4000=default, &2000=1 octave lower, &8000=1 octave higher etc 
  152. ;R4=repofs *
  153. ;R5=replen *
  154. ;R6=datastart
  155. ;R7=volume *
  156. ;R8=special (return R8=0)
  157. ; *= may return zero if not supported
  158.  
  159. ;Most of this routine deals with the DVox format's idiosyncrasies
  160.  
  161. .getinfo
  162. MOV R11,R1;our sample address
  163. MOV R1,#0; sample name - not supported by DVOX samples
  164. LDR R2,[R11,#dvox.len]; file length
  165. MOV R3,#0;finetune/volume value - not supported
  166. MOV R4,#0
  167. MOV R5,#0
  168. LDRB R7,[R11,#dvox.flags]    ;ignore repeat offset unless timed play is set
  169. TST R7,#0
  170. LDRNE R4,[R11,#dvox.repstart]
  171.                        ;we need the repeat offset
  172. LDRNE R5,[R11,#dvox.repend]
  173.                        ;we need the repeat length
  174. SUBNE R5,R5,R4         ; that's the repeat length sorted out
  175. LDR R6,[R11,#dvox.dataofs]
  176. SUB R2,R2,R6           ; convert file length to sample length
  177. SUBNE R4,R4,R6         ; that's the repeat offset
  178. ADD R6,R6,R11          ; R6 is the address of the sample data
  179. MOV R7,#0
  180. MOV R8,#0
  181. MOV PC,R14
  182.  
  183. .putinfo
  184. MOV R11,R1
  185. ;LDMFD R13,{R1}     ;no writeback
  186. LDR R6,[R11,#dvox.dataofs]
  187. ADD R2,R2,R6         ;put the values into datavox style
  188. ADD R4,R4,R6
  189. ADD R5,R5,R4
  190. TST R8,#1<<2
  191. STRNE R2,[R11,#dvox.len]
  192. TST R8,#1<<4
  193. STRNE R4,[R11,#dvox.repstart]
  194. TST R8,#1<<5
  195. STRNE R5,[R11,#dvox.repend]
  196. TST R8,#1<<6
  197. SUBNE R6,R6,R11
  198. STRNE R6,[R11,#dvox.dataofs]
  199. AND R0,R8,#%10001010         ;what we don't support
  200. MOV PC,R14
  201.  
  202. .identify
  203. ADD R0,R0,#1
  204. CMP R2,#0
  205. MOVEQ PC,R14
  206. ADR R12,alienblock
  207. STR R12,[R2],#4
  208. MOV PC,R14
  209.  
  210. ;On entry to a save routine, R0 is the slot number (for us to pass
  211. ;to Stasis_GetSlotInfo.
  212. ;R2 points to the filename
  213. ;R3 points to the namecheck routine in Stasis which compares the name
  214. ;pointed to by R1 to that entered at the command line
  215.  
  216. ;We pass on the Service call if we don't recognise the save type
  217. ;ie return with MOV PC,R14 with registers unchanged.
  218. ;If we want to save in our format we return with
  219. ;R0 preserved.
  220. ;R1=0 to claim the service call
  221. ;R2 points to a filled-in header block
  222. ;R3 is the length of the header block
  223. ;R4 is the filetype
  224. ;Stasis will add the sample data in logarithmic format after the header
  225. ;
  226. ;Otherwise return with R2=0 after carrying out the whole save process
  227. ;yourself.
  228. ;To return an error, return with R2=1 and R0 pointing to an error block.
  229.  
  230. .dvoxformat
  231. ;read with reference to the dvox struct at the start of this file
  232.  
  233. DCB 0
  234. DCB 0
  235. DCB &17
  236. DCB &7E
  237. DCD &20
  238. DCD 0
  239. DCD 0
  240. DCB "DVOX"
  241. DCD 3
  242. DCD 0
  243. DCD 0
  244.  
  245. .save
  246. STMFD R13!,{R1,R14}
  247. ADR R1,name1
  248. MOV R14,PC
  249. MOV PC,R3       ;BL to R3
  250. ADRNE R1,name2
  251. MOVNE R14,PC
  252. MOVNE PC,R3
  253. LDMFD R13!,{R1,R14}
  254. MOVNES PC,R14;return if no match
  255. STMFD R13!,{R0,R5-R10,R14}
  256. SWI Stasis_GetSlotInfo
  257. ADR R10,dvoxformat
  258. ADD R2,R2,#dvox.sizeof         ;fill in our header
  259. STR R2,[R10,#dvox.len]
  260. ADD R5,R5,R4                   ;R5 is now the repeat end
  261. ADD R4,R4,#dvox.sizeof
  262. STR R4,[R10,#dvox.repstart]
  263. ADD R5,R5,#dvox.sizeof
  264. STR R5,[R10,#dvox.repend]
  265. MOV R6,#dvox.sizeof
  266. STR R6,[R10,#dvox.dataofs]
  267. MOV R1,#0
  268. MOV R2,R10
  269. MOV R3,#dvox.sizeof
  270. MOV R4,#dvox_filetype
  271. LDMFD R13!,{R0,R5-R10,PC}
  272. ;return and let Stasis do the rest
  273.  
  274. .init                  ;My standard init/final service calls.
  275. STMFD R13!,{R0-R3,R14}
  276. ADR R0,start
  277. MOV R1,#Service_PsychoStarting
  278. MOV R2,#0; the R12 value
  279. MOV R3,stasis_alien
  280. ADR R4,alienblock
  281. SWI OS_ServiceCall
  282. CMP R1,#0
  283. LDMFD R13!,{R0-R3,R14}
  284. ADREQ R0,initerrtext
  285. ORRVS R14,R14,#1<<28
  286. MOVS PC,R14
  287.  
  288. .final
  289. STMFD R13!,{R0-R3,R14}
  290. ADR R0,start
  291. MOV R1,#Service_PsychoDying
  292. MOV R2,#0
  293. MOV R3,stasis_alien
  294. ADR R4,alienblock
  295. SWI OS_ServiceCall
  296. CMP R1,#0
  297. LDMFD R13!,{R0-R3,R14}
  298. ADREQ R0,finalerrtext
  299. ORRVS R14,R14,#1<<28
  300. MOVS PC,R14
  301.  
  302. .initerrtext
  303. DCD &809DFE
  304. DCB "StasisDVox : Initialisation veto",0
  305. ALIGN
  306. .finalerrtext
  307. DCD &809DFF
  308. DCB "StasisDVox : RMKill veto",0
  309.  
  310. .name1
  311. DCB "DataVox",0
  312. .name2
  313. DCB "DVox",0     
  314. .formatname
  315. DCB "DataVox format 3",0
  316. ALIGN
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.